package org.tuoren.official.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.tuoren.common.core.utils.MapstructUtils;
import org.tuoren.common.core.utils.StringUtils;
import org.tuoren.common.mybatis.core.page.PageQuery;
import org.tuoren.common.mybatis.core.page.TableDataInfo;
import org.tuoren.common.mybatis.helper.DataBaseHelper;
import org.tuoren.official.domain.TQrCode;
import org.tuoren.official.domain.bo.TQrCodeBo;
import org.tuoren.official.domain.vo.TQrCodeVo;
import org.tuoren.official.mapper.TQrCodeMapper;
import org.tuoren.official.service.ITQrCodeService;
import org.tuoren.system.domain.SysMenu;
import org.tuoren.system.domain.vo.SysMenuVo;
import org.tuoren.system.mapper.SysMenuMapper;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 二维码信息维护Service业务层处理
 *
 * @author Lion Li
 * @since 2024-11-26
 */
@RequiredArgsConstructor
@Service
public class TQrCodeServiceImpl implements ITQrCodeService {

    private final TQrCodeMapper baseMapper;
    private final SysMenuMapper menuMapper;

    /**
     * 查询二维码信息维护
     *
     * @param id 主键
     * @return 二维码信息维护
     */
    @Override
    public TQrCodeVo queryById(Long id){
        return baseMapper.selectVoById(id);
    }

    /**
     * 分页查询二维码信息维护列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 二维码信息维护分页列表
     */
    @Override
    public TableDataInfo<TQrCodeVo> queryPageList(TQrCodeBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<TQrCode> lqw = buildQueryWrapper(bo);
        Page<TQrCodeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    /**
     * 查询符合条件的二维码信息维护列表
     *
     * @param bo 查询条件
     * @return 二维码信息维护列表
     */
    @Override
    public List<TQrCodeVo> queryList(TQrCodeBo bo) {
        LambdaQueryWrapper<TQrCode> lqw = buildQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }

    private LambdaQueryWrapper<TQrCode> buildQueryWrapper(TQrCodeBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<TQrCode> lqw = Wrappers.lambdaQuery();
        lqw.like(StringUtils.isNotBlank(bo.getName()), TQrCode::getName, bo.getName());
        lqw.eq(StringUtils.isNotBlank(bo.getQrCodeUrl()), TQrCode::getQrCodeUrl, bo.getQrCodeUrl());
        lqw.eq(bo.getMenuId() != null, TQrCode::getMenuId, bo.getMenuId());
        return lqw;
    }

    /**
     * 新增二维码信息维护
     *
     * @param bo 二维码信息维护
     * @return 是否新增成功
     */
    @Override
    public Boolean insertByBo(TQrCodeBo bo) {
        TQrCode add = MapstructUtils.convert(bo, TQrCode.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(add.getId());
        }
        return flag;
    }

    /**
     * 修改二维码信息维护
     *
     * @param bo 二维码信息维护
     * @return 是否修改成功
     */
    @Override
    public Boolean updateByBo(TQrCodeBo bo) {
        TQrCode update = MapstructUtils.convert(bo, TQrCode.class);
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
    }

    /**
     * 保存前的数据校验
     */
    private void validEntityBeforeSave(TQrCode entity){
        //TODO 做一些数据校验,如唯一约束
    }

    /**
     * 校验并批量删除二维码信息维护信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    @Override
    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
        if(isValid){
            //TODO 做一些业务上的校验,判断是否需要校验
        }
        return baseMapper.deleteByIds(ids) > 0;
    }

    /**
     * 官网-获取二维码信息列表（页面底部：0；合作通道：传入相应菜单Id）
     *
     * @param menuId 菜单Id
     */
    @Override
    public TableDataInfo<TQrCodeVo> queryList(Long menuId,String plat){
        LambdaQueryWrapper<TQrCode> lqw = new LambdaQueryWrapper<TQrCode>();
        if(menuId != 0){
            // 菜单ID转换为后台菜单ID
            // 1 获取菜单信息
            SysMenuVo menu = menuMapper.selectVoById(menuId);
            if(menu!= null && menu.getRelevanceId() != null){
                // 2 菜单信息不为null且关联后台Id不为null，判断其是否存在子菜单
                List<SysMenuVo> childs = menuMapper.selectVoList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId,menu.getRelevanceId()));
                // 存在子菜单
                if(childs != null && childs.size() > 0){
                    // 3 获取子菜单列表
                    List<Long> childIds = childs.stream().map(SysMenuVo::getMenuId).collect(Collectors.toList());
                    lqw.in(TQrCode::getMenuId,childIds);
                    if (plat != null) lqw.apply(DataBaseHelper.findInSet(plat, "plat"));
                    return TableDataInfo.build(baseMapper.selectVoList(lqw));
                }else{
                    // 4 不存在子菜单，查询其父节点
                    SysMenuVo parent = menuMapper.selectVoById(menu.getParentId());
                    // 5 菜单信息不为null且关联后台Id不为null，判断其是否存在子菜单
                    List<SysMenuVo> chis = menuMapper.selectVoList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId,parent.getRelevanceId()));
                    List<Long> childIds = chis.stream().map(SysMenuVo::getMenuId).collect(Collectors.toList());
                    lqw.in(TQrCode::getMenuId,childIds);
                    if (plat != null) lqw.apply(DataBaseHelper.findInSet(plat, "plat"));
                    return TableDataInfo.build(baseMapper.selectVoList(lqw));
                }
            }
        }
        if(plat ==null) plat = "1";
        lqw.eq(TQrCode::getMenuId,menuId);
        if (plat != null) lqw.apply(DataBaseHelper.findInSet(plat, "plat"));
        return TableDataInfo.build(baseMapper.selectVoList(lqw));
    }
}
